package com.hyou.demos.mybatis.base;

import java.util.Map;

import javax.annotation.Resource;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;

/**
 * Service基类
 * 
 * @author FengChangshuo
 * @version 1.0.0 2015年11月12日 下午4:17:11 created
 */
public class BaseService implements InitializingBean {
    
    @Resource(name = "defaultDataSource")
    private String defaultDataSource;
    
    @Resource(name = "sqlSessionMap")
    private Map<String, SqlSession> sqlSessionMap;
    
    /**
     * 获取连接至默认数据源的SqlMapper对象
     * 
     * @param <T> DAO接口定义类型
     * @param daoClass 要映射成的SQLMapper接口类型
     * @return SQLMapper对应的接口类型
     */
    public <T> T getMapper(Class<T> daoClass) {
        return getMapper(daoClass, this.defaultDataSource);
    }
    
    /**
     * 获取连接至指定数据源的SqlMapper对象
     * 
     * @param <T> DAO接口定义类型
     * @param daoClass 要映射成的SQLMapper接口类型
     * @param dsContext 指定获取的数据源标识
     * @return SQLMapper对应的接口类型
     */
    public <T> T getMapper(Class<T> daoClass, String dsContext) {
        return sqlSessionMap.get(dsContext).getMapper(daoClass);
    }
    
    /**
     * 获取连接至指定数据源的SqlMapper对象
     * 
     * @param <T> DAO接口定义类型
     * @param daoClass 要映射成的SQLMapper接口类型
     * @param sqlSession 指定获取的数据源Session对象
     * @return SQLMapper对应的接口类型
     */
    public <T> T getMapper(Class<T> daoClass, SqlSession sqlSession) {
        return sqlSession.getMapper(daoClass);
    }
    
    /**
     * 获取主数据源的SqlMapper对象
     * 
     * @param <T> DAO接口定义类型
     * @param daoClass 要映射成的SQLMapper接口类型
     * @return SQLMapper对应的接口类型
     */
    public <T> T getWriteMapper(Class<T> daoClass) {
        return getMapper(daoClass, "writeDataSource");
    }
    
    /**
     * 获取读数据源的SqlMapper对象
     * 
     * @param <T> DAO接口定义类型
     * @param daoClass 要映射成的SQLMapper接口类型
     * @return SQLMapper对应的接口类型
     */
    public <T> T getReadMapper(Class<T> daoClass) {
        return getMapper(daoClass, "readDataSource");
    }
    
    /**
     * <pre>
     * 获取默认的数据库连接
     * 
     * 版本修改历史记录：
     * 1) 2014年11月10日 下午4:06:45 Changshuo.Feng 初始创建
     * </pre>
     * 
     * @return 默认的数据源对应的SqlSession对象
     */
    public final SqlSession getSpecifySqlSession(String dsContext) {
        return sqlSessionMap.get(dsContext);
    }
    
    /**
     * <pre>
     * 获取默认的数据库连接
     * 
     * 版本修改历史记录：
     * 1) 2014年11月10日 下午4:06:45 Changshuo.Feng 初始创建
     * </pre>
     * 
     * @return 默认的数据源对应的SqlSession对象
     */
    public final SqlSession getDefaultSqlSession() {
        return sqlSessionMap.get(defaultDataSource);
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        Assert.hasLength(this.defaultDataSource);
        Assert.notNull(this.sqlSessionMap);
    }
    
}
